/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cuatroenraya.jugadores;

import cuatroenraya.Jugador;
import cuatroenraya.util.HeuristicaList;
import java.util.ArrayList;

/**
 *
 * @author Dario
 */
public class JugadorGrupo14 extends Jugador {

    private static Arbol arbol;
    private int[] jugada;
    private int ficha;
    private int fichaOp;
    private static Jugada jugadasAnt[] = new Jugada[6];
    private static int indice;

    public JugadorGrupo14(int cantFichas) {
        super(cantFichas);
        jugada = new int[4];
        arbol = new Arbol();
        indice = 0;
    }

    public void armarArbol(int[][] tableroActual) {

        actualizarFichasOponente(tableroActual);
//        arbol = new Arbol(tableroActual, ficha, fichaOp);
        arbol.crearRaiz(tableroActual, getNumeroJugador(), fichaOp);
        Boolean esMover = true;
        if (Arbol.misFichas.size() < 5) {
            esMover = false;
        }
        arbol.cargarArbol(esMover);
    }

    @Override
    public int[] jugar(int tablero[][]) {
        armarArbol(tablero);
        int casiMayor = 0;
        int mayor = 0;
        Node nMayor = null;
        Node nCasi = null;
        ArrayList<Node> hijos = Arbol.Hijos;
        for (int i = 0; i < hijos.size(); i++) {
            Node node = hijos.get(i);
            HeuristicaList hlaux = Arbol.hlNietos.get(i);
            int ptoNietos =
                    hlaux.list.get(hlaux.list.size() - 1).getHeuristica();
            int hFinal = node.getPuntuacion() - ptoNietos;

            if (i == 0) {
                casiMayor = mayor;
                mayor = hFinal;
                nCasi = nMayor;
                nMayor = node;
            }
            if (hFinal > mayor) {
                casiMayor = mayor;
                mayor = hFinal;
                nCasi = nMayor;
                nMayor = node;
            }
//            System.out.println("HIJO N°" + (i + 1));
        }
        System.out.println("Heuristica Final Pri: " + mayor);
        Jugada j = nMayor.getJugada();
        if (verificarJugadasAnteriores(j) >= 2 && nCasi != null) {
            j = nCasi.getJugada();
            System.out.println("Heuristica Final Sec: " + casiMayor);

        }
        this.jugada[0] = j.getPosicionInicial().getY();
        this.jugada[1] = j.getPosicionInicial().getX();
        this.jugada[2] = j.getPosicionFinal().getY();
        this.jugada[3] = j.getPosicionFinal().getX();
        if (this.jugada[0] == -1 && this.jugada[1] == -1) {
            Arbol.misFichas.add(j.getPosicionFinal());
        } else {
            for (int i = 0; i < Arbol.misFichas.size(); i++) {
                Posicion p = Arbol.misFichas.get(i);
                if (this.jugada[0] == p.getY() && this.jugada[1] == p.getX()) {

                    Arbol.misFichas.set(i, j.getPosicionFinal());
                }
            }
        }
        jugadasAnt[indice] = j;
        indice++;
        Arbol.Hijos.clear();
        Arbol.Nietos.clear();
        return jugada;
    }

    private int verificarJugadasAnteriores(Jugada nueva) {
        int misma = 0;
        if (indice == jugadasAnt.length) {
            indice = 0;
            for (int i = 0; i < jugadasAnt.length; i++) {
                jugadasAnt[i] = null;
                
            }
        }
        for (int i = 0; i < jugadasAnt.length && jugadasAnt[i] != null; i++) {
            if (nueva.getPosicionInicial().equals(jugadasAnt[i].
                    getPosicionInicial()) && nueva.getPosicionFinal().equals(jugadasAnt[i].getPosicionFinal())) {
                misma++;                
            }
        }
        return misma;
    }

    public void actualizarFichasOponente(int tablero[][]) {
        Arbol.fichasOponente.clear();
        for (int i = 0; i < tablero.length; i++) {
            for (int j = 0; j < tablero.length; j++) {
                ficha = getNumeroJugador();
                if (tablero[i][j] != 0 && tablero[i][j] != ficha) {
                    Posicion op = new Posicion(j, i);
                    Arbol.fichasOponente.add(op);
                    fichaOp = tablero[i][j];
                }
            }
        }
    }
}
